package com.resume.utils;

import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则表达式工具类
 *
 * @author 梁云亮
 */
public class RegexUtil {


    /**
     * 返回所有匹配到的内容
     *
     * @param regex 正则表达式字符串
     * @param str   要匹配的字符串
     * @return
     */
    public static List<String> group(String str, String regex) {
        if (null == str || null == regex) {
            return null;
        }
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        List<String> list = new LinkedList<>();
        while (matcher.find()) {
            list.add(matcher.group());
        }
        return list;
    }

    /**
     * 存在匹配
     *
     * @param str
     * @param regex
     * @return
     */
    private static boolean find(String str, String regex) {
        if (null == str || str.trim().length() <= 0) {
            return false;
        }
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);
        return matcher.find();
    }

    /**
     * 全字匹配
     *
     * @param str   匹配的字符串
     * @param regex 匹配模式
     * @return boolean
     */
    private static boolean matches(String str, String regex) {
        if (null == str || str.trim().length() <= 0) {
            return false;
        }
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    ///////////////////////////////////////////////////////////////////////////////////////

    /**
     * 验证Email
     *
     * @param email email地址
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkEmail(String email) {
        String regex = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
        return matches(email, regex);
    }

    /**
     * 验证手机号码（支持国际格式，+86135xxxx...（中国内地），+00852137xxxx...（中国香港））
     *
     * @param mobile 移动、联通、电信运营商的号码段
     *               <p>移动的号段：134(0-8)、135、136、137、138、139、147（预计用于TD上网卡）
     *               、150、151、152、157（TD专用）、158、159、187（未启用）、188（TD专用）</p>
     *               <p>联通的号段：130、131、132、155、156（世界风专用）、185（未启用）、186（3g）</p>
     *               <p>电信的号段：133、153、180（未启用）、189</p>
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkMobile(String mobile) {
        String regex = "(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}";
        return matches(mobile, regex);
    }

    /**
     * 验证中文
     *
     * @param chinese 中文字符，仅适合中国汉字，不包括标点
     * @return 验证成功返回true，验证失败返回fals
     */
    public static boolean checkChinese(String chinese) {
        String regex = "^[\u4E00-\u9FA5]+$";
        return matches(chinese, regex);
    }

    /**
     * 验证日期（1900-01-01到2099-12-30）
     *
     * @param birthday 日期，格式：1992-09-03
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkBirthday(String birthday) {
        String regex = "(19|20)\\d{2}-(1[0-2]|0?[1-9])-(3[0-1]|2[0-9]|0?[1-9])";
        return matches(birthday, regex);
    }

    /**
     * 验证URL地址
     *
     * @param url 格式：http://blog.csdn.net:80/xyang81/article/details/7705960? 或 http://www.csdn.net:80
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkURL(String url) {
        String regex = "(https?://(w{3}\\.)?)?\\w+\\.\\w+(\\.[a-zA-Z]+)*(:\\d{1,5})?(/\\w*)*(\\??(.+=.*)?(&.+=.*)?)?";
        return matches(url, regex);
    }

    /**
     * <pre>
     * 获取网址 URL 的一级域
     * </pre>
     *
     * @param url
     * @return
     */
    public static String getDomain(String url) {
        Pattern p = Pattern.compile("(?<=http://|\\.)[^.]*?\\.(com|cn|net|org|biz|info|cc|tv)", Pattern.CASE_INSENSITIVE);
        // 获取完整的域名
        // Pattern p=Pattern.compile("[^//]*?\\.(com|cn|net|org|biz|info|cc|tv)", Pattern.CASE_INSENSITIVE);
        Matcher matcher = p.matcher(url);
        matcher.find();
        return matcher.group();
    }

    /**
     * 匹配中国邮政编码
     *
     * @param postcode 邮政编码
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkPostcode(String postcode) {
        String regex = "[1-9]\\d{5}";
        return matches(postcode, regex);
    }

    /**
     * 匹配IP地址(简单匹配，格式，如：192.168.1.1，127.0.0.1，没有匹配IP段的大小)
     *
     * @param ipAddress IPv4标准地址
     * @return 验证成功返回true，验证失败返回false
     */
    public static boolean checkIpAddress(String ipAddress) {
        String regex = "((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))";
        return Pattern.matches(regex, ipAddress);
    }

    public static void main(String[] args) {
        System.out.println(checkEmail("369950806@qq.com"));
        System.out.println(checkMobile("13523449312"));
        System.out.println(checkChinese("我是中国人"));
        System.out.println(checkBirthday("2092-09-23"));
        System.out.println(checkURL("https://www.baidu.com"));
        System.out.println(getDomain("http://www.hcithome.com/asdf/fds.html"));
        System.out.println(checkPostcode("451450"));
        System.out.println(checkIpAddress("192.168.23.245"));
    }


}

